Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Exceptions
8 Die Funktionsbibliothek
9 Threads und nebenläufige Programmierung
10 Raum und Zeit
11 Datenstrukturen und Algorithmen
12 Dateien und Datenströme
13 Die eXtensible Markup Language (XML)
14 Grafische Oberflächen mit Swing
15 Grafikprogrammierung
16 Das Netz
17 JavaServer Pages und Servlets
18 Verteilte Programmierung mit RMI und Web–Services
19 Applets, Midlets und Sound
20 Datenbankmanagement mit JDBC
21 Reflection und Annotationen
22 Komponenten durch Bohnen
23 Logging und Monitoring
24 Sicherheitskonzepte
25 Java Native Interface (JNI)
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Index

Download:
- ZIP, ca. 12,5 MB
Buch bestellen

Website zum Buch
Weblog des Autors
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
6., akt. und erw. Aufl., mit DVD
1.454 S., 49,90 Euro
Galileo Computing
ISBN 3-89842-838-9
gp 17 JavaServer Pages und Servlets
  gp 17.1 Dynamisch generierte Webseiten
    gp 17.1.1 Was sind Servlets?
    gp 17.1.2 Was sind JavaServer Pages?
  gp 17.2 Servlets und JSPs mit Tomcat entwickeln
    gp 17.2.1 Servlet-Container
    gp 17.2.2 Entwicklung der Servlet/JSP-Spezifikationen
    gp 17.2.3 Webserver mit Servlet-Funktionalität
    gp 17.2.4 Tomcat
    gp 17.2.5 Ablageort für eigene JSP-Seiten
    gp 17.2.6 Webapplikationen
    gp 17.2.7 Zuordnung von Webapplikationen zu physikalischen Verzeichnissen
    gp 17.2.8 Mit dem WTP ein Web-Projekt entwickeln
  gp 17.3 JSP-Konstrukte
    gp 17.3.1 Scriptlets
    gp 17.3.2 Ausdrücke
    gp 17.3.3 Deklarationen
    gp 17.3.4 Kommentare
    gp 17.3.5 Quoting
    gp 17.3.6 Entsprechende XML-Tags
  gp 17.4 Implizite Objekte
  gp 17.5 Formulardaten
  gp 17.6 Auf Beans zurückgreifen
    gp 17.6.1 Die Bean-Klasse
    gp 17.6.2 Beans in JSP-Seiten anlegen
    gp 17.6.3 Attribute setzen und erfragen
    gp 17.6.4 Der schnelle Zugriff auf Parameter
  gp 17.7 Mit HttpServletRequest an die geschickten Browser-Daten
    gp 17.7.1 Verarbeiten der Header
    gp 17.7.2 Hilfsfunktion im Umgang mit Headern
    gp 17.7.3 Übersicht der Browser-Header
  gp 17.8 Das HttpServletResponse-Objekt
    gp 17.8.1 Automatisches Neuladen
    gp 17.8.2 Seiten umlenken
  gp 17.9 JSP-Direktiven
    gp 17.9.1 page-Direktiven im Überblick
    gp 17.9.2 Die include-Direktive
    gp 17.9.3 Mit JSPs Bilder generieren
  gp 17.10 Aktionen
    gp 17.10.1 Die Aktion include
    gp 17.10.2 Die Aktion forward
    gp 17.10.3 Die Aktion plugin
  gp 17.11 Kleine Kekse: die Klasse Cookies
    gp 17.11.1 Cookies erzeugen und setzen
    gp 17.11.2 Cookies vom Servlet einlesen
    gp 17.11.3 Cookie-Status ändern
    gp 17.11.4 Langlebige Cookies
  gp 17.12 Sitzungsverfolgung (Session Tracking)
    gp 17.12.1 Das mit einer Sitzung verbundene Objekt HttpSession
    gp 17.12.2 Werte mit einer Sitzung assoziieren und auslesen
    gp 17.12.3 URL-Rewriting
    gp 17.12.4 Zusätzliche Informationen
  gp 17.13 JSTL und weitere Tag-Libraries
    gp 17.13.1 Standard Tag Library (JSTL)
    gp 17.13.2 Jakarta Taglibs Project
  gp 17.14 Servlets
    gp 17.14.1 Servlets compilieren
    gp 17.14.2 Die Servlets in das classes-Verzeichnis bringen
    gp 17.14.3 Servlet-Mapping
  gp 17.15 Der Lebenszyklus eines Servlets
    gp 17.15.1 Abfragen bei service()
    gp 17.15.2 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
    gp 17.15.3 Das Ende eines Servlets
  gp 17.16 Das HttpServletResponse-Objekt
    gp 17.16.1 Wir generieren eine Webseite
    gp 17.16.2 Binärdaten senden
    gp 17.16.3 Noch mehr über Header, die der Server setzt
  gp 17.17 Objekte und Dateien per POST verschicken
    gp 17.17.1 Datei-Upload
  gp 17.18 Servlets und Sessions
  gp 17.19 Weiterleiten und Einbinden von Servlet-Inhalten
  gp 17.20 Inter-Servlet-Kommunikation
    gp 17.20.1 Daten zwischen Servlets teilen
  gp 17.21 Internationalisierung
    gp 17.21.1 Die Länderkennung des Anfragers auslesen
    gp 17.21.2 Länderkennung für die Ausgabe setzen
    gp 17.21.3 Westeuropäische Texte senden
  gp 17.22 Tomcat: Spezielles
    gp 17.22.1 Tomcat als Service unter Windows NT ausführen
  gp 17.23 Zum Weiterlesen


Galileo Computing

17.15 Der Lebenszyklus eines Servlets  downtop

Der Container für Servlets registriert eine Anfrage durch den Client und lädt das Servlet in den Speicher. Da Servlets normale Klassen sind, übernimmt ein spezieller Klassenlader diese Aufgabe. Die Abarbeitung findet anschließend in einem Thread statt, der die Methoden des Servlet-Objekts aufruft.

Wir wollen nun verfolgen, wie der Container die Arbeit an das Servlet delegiert. Über die Schnittstelle Servlet werden drei elementare Methoden für die Initialisierung, die Abarbeitung der Anfragen und die Beendigung vorgeschrieben. Der Ablauf dieser Methoden heißt Lebenszyklus eines Servlets.

Die folgende Aufzählung zeigt alle Methoden, die die Schnittstelle Servlet für alle Java-Servlets vorschreibt.


interface javax.servlet.Servlet

  • void init( ServletConfig config ) Wird zu Beginn eines Dienstes aufgerufen.
  • void service( ServletRequest req, ServletResponse res ) Der Container leitet die Anfrage an das Servlet an diese Stelle.
  • void destroy() Wird am Ende eines Servlets vom Container genau einmal aufgerufen.
  • ServletConfig getServletConfig() Liefert ein ServletConfig-Objekt, das Initialisierungs- und Startparameter kapselt.
  • String getServletInfo() Liefert Informationen über das Servlet wie Autor, Version und Copyright.

Beispiel Ein Servlet implementiert getServletInfo(), um Informationen an den Servlet-Container zu übermitteln.
public class FirstServlet extends GenericServlet 
{ 
  public void service( ServletRequest request, ServletResponse response ) 
  { 
  } 
  public String getServletInfo() 
  { 
    return "Ich bin der erste Erguss seiner Servlet-Fähigkeiten"; 
  } 
}


Galileo Computing

17.15.1 Abfragen bei service()  downtop

In unserem ersten Beispiel haben wir uns der Klasse GenericServlet bedient, um eine service()-Methode zu überschreiben, die auf beliebige Anfragen des Clients antwortet. In der Regel wollen wir bei unterschiedlichen Anfragen aber auch unterschiedlich reagieren. Eine Anfrage ist zum Beispiel GET. Diese Form wird dann benutzt, wenn im Browser vom Benutzer eine URL eingetragen oder ein Verweis verfolgt wird. Neben GET-Anfragen gibt es noch POST-Anfragen, die für Formulare Verwendung finden.

Klasse HttpServlet

Damit wir auf GET-Anfragen anders reagieren können als auf POST-Anfragen, sind zwei Möglichkeiten denkbar: Entweder können wir die service()-Methode überschreiben, den Typ herausfinden und dann die Anfrage behandeln, oder wir verwenden eine andere Klasse, nämlich HttpServlet. Sie implementiert service() so, dass Anfragen an Methoden wie doGet(), doPost() und entsprechende Methoden weitergeleitet werden. Bei eigenen Anfragen wollen wir im Folgenden immer HttpServlet erweitern und service() nicht mehr direkt verwenden, sondern die entsprechenden doXXX()-Methoden.

Implementierung von service() in HttpServlet

Die service()-Methode der Klasse HttpServlet erfragt die verwendete Methode (GET oder POST) mit der Dienstmethode getMethod() vom aktuellen Request. Kurz skizziert hat sie folgendes Format:

protected void service( HttpServletRequest req, HttpServletResponse resp ) 
  throws ServletException, IOException 
{ 
  String method = req.getMethod (); 
  if (method.equals(METHOD_GET)) { 
    ... 
  } else if (method.equals (METHOD_HEAD)) { 
    ... 
  } else if (method.equals (METHOD_POST)) { 
    doPost (req, resp); 
  } else { 
    ... 
    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, 
                   errMsg); 
  } 
}

Auf diese Weise testet service() zusätzlich auf METHOD_PUT, METHOD_DELETE, METHOD_OPTIONS und METHOD_TRACE.


Hinweis Die service()-Methode überschreiben bedeutet auch, dass wir uns um die Sicherheit Gedanken machen müssen. Wenn wir nur doGet() und doPost() gleich behandeln wollen, so implementieren wir zum Beispiel doGet() und leiten die Anfrage an doPost() weiter. Wenn wir alles in service() implementieren, dann kann Programmcode bei allen Anfragetypen ablaufen.


Galileo Computing

17.15.2 Mehrere Anfragen beim Servlet und die Thread-Sicherheit  downtop

In der Regel nutzt der Container pro Anfrage einen Thread, der dann die service()-Methode des Servlet-Objekts betritt und die Anfrage bearbeitet. Es gibt demnach für mehrere Aufträge keine unterschiedlichen Exemplare des Servlets, sondern lediglich unterschiedliche Threads bei einem Servlet-Exemplar. Aus diesem Grund ist zu bedenken, dass die Dienste seiteneffektfrei sein müssen. Es ist unsere Aufgabe, die Methode soweit zu synchronisieren, dass es keine negativen Auswirkungen der Parallelität gibt. Die Synchronisation wirkt sich natürlich auf die Ausführungsgeschwindigkeit nachteilig aus, so dass auf die passende Granularität zu achten ist.


Galileo Computing

17.15.3 Das Ende eines Servlets  toptop

Wenn eine Servlet-Klasse nicht mehr benötigt wird und aus dem Speicher entfernt werden soll, ruft der Container zum Abschluss die Methode destroy() auf. Hier findet sich der Programmcode, der für die Freigabe sorgt und die aus init() bereitgestellten Ressourcen wieder freigibt. Häufig findet sich in init() und destroy() ein Mechanismus, der serialisierte Daten liest und schreibt. Doch was ist, wenn der Container vor destroy() den Geist aufgibt? Dies führt zu Problemen, wenn in destroy() Daten für die Persistenz serialisiert werden. Sie würden bei einem Absturz verloren gehen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.





 <<   zurück



Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de